#include <iostream>
#include <memory>  //智能指针对应的头文件
using namespace std;

/*
	三种智能指针的区别
	   1.通过对象之间赋值来分析三者的区别
	   2.理论上分析：  
	        三种智能指针对象，理论上来说不能相互赋值(因为对象释放的时候会调用析构，析构会释放堆空间)
			同一个堆空间不可以释放多次
	   3.实际看到的情况
	        (1)auto_ptr对象之间可以赋值
			   策略：把赋值运算右边对象堆空间的所有权转让给左边对象，右边对象指向NULL
			   
	   
*/

int main()
{
	auto_ptr<int> p1(new int);
	//给p1申请的堆空间赋值
	*p1=666;
	cout<<"*p1 is: "<<*p1<<endl;
	
	auto_ptr<int> p2;
	p2=p1; //auto_ptr的源码会把p1拥有的堆空间所有权转让给p2，p1就不能在访问之前的堆空间了
	
	//段错误就是这句话引起的：p1不再具备访问之前堆空间的能力(被剥夺了)
	//cout<<"*p1 is: "<<*p1<<endl;
	cout<<"*p2 is: "<<*p2<<endl;
	
	auto_ptr<int> p3;
	p3=p2;
	//段错误就是这句话引起的：p2不再具备访问之前堆空间的能力(被剥夺了)
	//cout<<"*p2 is: "<<*p2<<endl;
	cout<<"*p3 is: "<<*p3<<endl;
	return 0;
}